/* 潘悟雲擬音
 *
 * 兩個版本：
 *
 * - 潘悟雲. 漢語歷史音韻學. 上海: 上海教育出版社, 2000.
 * - 潘悟雲, 張洪明. 漢語中古音. 語言研究, 2013, 33 (2): 1–7.
 *
 * @author unt
 */

const is = (...x) => 音韻地位.屬於(...x);
const when = (...x) => 音韻地位.判斷(...x);
const is2000 = Boolean(選項.版本?.includes('2000'));

if (!音韻地位) return [
  ['版本', [2,
    '2000：漢語歷史音韻學',
    '2013：漢語中古音',
  ]],
  ['非前三等介音', [2, 'i（原書簡寫）', 'ɨ（實際音值）']],
  ['聲調記號', is2000 ?
    [2, '隱藏', '五度符號（按照 2013）', '調值數字（按照 2013）'] : // 《漢語歷史音韻學》未給具體調值
    [2, '隱藏', '五度符號', '調值數字']
  ],
  ['送氣記號', is2000 ? [1, 'ʰ（通用）', 'h（原書）'] : null],
  ['支韻', is2000 ? [1, 'iɛ（簡寫）', 'iᵉ（實際音值）'] : null],
  ['虞韻', is2000 ? [2, 'io（簡寫）', 'iʊ（實際音值）'] : null],
];
/* 韻典網與本方案 2000 擬音不同之處：
 *
 * - 歌一合誤作 uɑ，應爲 ʷɑ
 * - 部分祭合、薛合誤作 iei、iet，應爲 iɛi、iɛt
 * - 幫組陽韻歸合口。原書雖未指明，但暗示爲開口；本方案歸開口
 * - 送氣記號改作 ʰ，原書作 h；本方案可自選
 * - 支韻、虞韻作 iɛ、io，原書韻母擬音比較表作 iᵉ、iʊ；本方案可自選
 */

function get聲母() {
  let 聲母 = {
    幫: 'p', 滂: 'pʰ', 並: 'b', 明: 'm',
    端: 't', 透: 'tʰ', 定: 'd', 泥: 'n', 來: 'l',
    知: 'ʈ', 徹: 'ʈʰ', 澄: 'ɖ', 孃: 'ɳ',
    見: 'k', 溪: 'kʰ', 羣: 'ɡ', 疑: 'ŋ',
    影: 'ʔ', 曉: 'h', 匣: 'ɦ', 云: 'ɦ',
    精: 'ts', 清: 'tsʰ', 從: 'dz', 心: 's', 邪: 'z',
    莊: 'tʂ', 初: 'tʂʰ', 崇: 'dʐ', 生: 'ʂ', 俟: 'ʐ',
    章: 'tɕ', 昌: 'tɕʰ', 常: 'dʑ', 書: 'ɕ', 船: 'ʑ', 日: 'ȵ', 以: 'j',
    // 生母《漢語歷史音韻學》作“ʃ”，係誤植
    // 從母《漢語中古音》聲母表作“ʣ”，係排版錯誤，正文作“dz”
    // 俟母《漢語中古音》聲母表未列，此處補上
  }[音韻地位.母];
  if (is2000) 聲母 = 聲母.replace('ʰ', 選項.送氣記號[0]);
  return 聲母;
}

function get韻母() {
  if (is`凡韻`) 音韻地位 = 音韻地位.調整({ 韻: '嚴' });
  const 元音表 = {
    ɪ: '　　　臻　　',
    i: '脂　侵眞　幽', ɨ: '之蒸　欣微尤', u: '侯東　文　　',
    e: '　青添先齊蕭', ə: '　登覃痕咍　', o: '模冬　魂灰　',
    ᴇ: '支清鹽仙祭宵', ɤ: '魚　　元　　', ʊ: '虞鍾　　　　',
    ɛ: '佳耕咸山皆　', a: '　陽嚴　廢　', ɔ: '　江　　　　',
    æ: '麻庚銜刪夬肴', ɑ: '歌唐談寒泰豪',
  };
  const 韻尾列表 = [''].concat(is`舒聲` ? [...'ŋmniu'] : [...'kpt']);
  let 韻核 = Object.keys(元音表).find(e => 元音表[e].includes(音韻地位.韻));
  let 韻尾 = 韻尾列表[元音表[韻核].indexOf(音韻地位.韻)];

  let 介音 = '';
  if (is`合口` && ![...'mpu'].includes(韻尾) && ![...'uoʊɔ'].includes(韻核))
    介音 += 'ʷ';
  if (is`幫組` && ![...'ŋkmpu'].includes(韻尾) && [...'ɨəɤaɑ'].includes(韻核) && !is`泰韻`)
    介音 += is2000 ? 'ʷ' : 'u̯';
  if (is`二等 或 庚韻 或 重紐B類 非 蒸幽韻`)
    介音 += is2000 ? 'ɯ' : 'ɣ';
  if (is`三等` && ![...'ɪiɨ'].includes(韻核))
    介音 += [...'ᴇæ'].includes(韻核) ? 'i' : 選項.非前三等介音[0];
  if ([...'oʊ'].includes(韻核))
    介音 += is2000 ? 介音 ? '' : 'u' : 'u̯';

  // 調整韻核
  if (is2000) {
    const 韻核鏈移列表 = [...'ᴇɛæaɐ']; // “鏈移”只是比喻
    if (韻核鏈移列表.includes(韻核)) 韻核 = 韻核鏈移列表[韻核鏈移列表.indexOf(韻核) + 1];

    韻核 = {
      尤: 'i', 幽: 'ɨ', 侯: 'əu',
      支: 選項.支韻[1], 魚: 'ɔ', 虞: 選項.虞韻[1],
      元: 'ɐ', 鍾: 'o',
    }[音韻地位.韻] ?? 韻核;
  } else {
    韻核 = 韻核.replace('ʊ', 'o̝');
  }
  return 介音 + 韻核 + 韻尾;
}

function get聲調() {
  return 選項.聲調記號 === '隱藏' ? '' : {
    '五度符號': ['˧', '˧˥', '˥˩', '꜊'],
    '調值數字': ['³³', '³⁵', '⁵¹', '³'],
  }[選項.聲調記號.slice(0, 4)]['平上去入'.indexOf(音韻地位.聲)];
}

return get聲母() + get韻母() + get聲調();
